﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cotizav.CONEXION;
using System.Transactions;
using System.Windows.Forms;

namespace Cotizav.CONTROLADOR
{
    class CtrlPeriodo
    {    
        ConexionDataContext conexion;
        CtrlNumeroCotizacion ctNumeroCotizacion;

        public CtrlPeriodo()
        {
            ctNumeroCotizacion = new CtrlNumeroCotizacion();
        }
        
        internal CONEXION.PERIODO getPeriodoActual()
        {
            using (conexion = new ConexionDataContext())
            {
                try
                {
                    PERIODO result = conexion.PERIODO.SingleOrDefault(x => x.activo == 1);
                    return result;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal List<PERIODO> getListPeriodos()
        {
            using (conexion = new ConexionDataContext())
            {
                try
                {
                    return conexion.PERIODO.Where(x => x.eliminado == 0).ToList();
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal bool registrarNuevoPeriodo(PERIODO newPeriodo)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        //cerramos el ultimo periodo anterior, se seleccionan varios de haber uno o más
                        List<PERIODO> lastPeriods = conexion.PERIODO.Where(x => x.activo == 1 && x.eliminado == 0).ToList();

                        foreach (PERIODO p in lastPeriods)
                        {
                            p.activo = 0;
                        }                        
                        conexion.SubmitChanges();

                        //insertamos el nuevo periodo
                        conexion.PERIODO.InsertOnSubmit(newPeriodo);
                        conexion.SubmitChanges();

                        ts.Complete();
                        return true;
                    }
                    catch (Exception)
                    {                        
                        throw;
                    }                    
                }
            }
        }

        internal DateTime getFechaServidor()
        {
            using (conexion = new ConexionDataContext())
            {
                DateTime result = conexion.usp_obtenerFechaServidor().FirstOrDefault().Column1;

                return result;
            }
        }

        internal bool esPeriodoActual()
        {
            using (conexion = new ConexionDataContext())
            {
                try
                {
                    PERIODO periodoActual = this.getPeriodoActual();

                    if (periodoActual != null)
                    {
                        DateTime fechaServidor = this.getFechaServidor();
                        int mesPeriodoActual = periodoActual.mesPeriodo.Value;
                        int anioPeriodoActual = periodoActual.anioPeriodo.Value;

                        if (mesPeriodoActual.Equals(fechaServidor.Month) && anioPeriodoActual.Equals(fechaServidor.Year))
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        //primer uso
                        return false;
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal bool establecerNuevoPeriodo()
        {
            DateTime fechaServidor = this.getFechaServidor();

            PERIODO newPeriodo = new PERIODO()
            {
                mesPeriodo = fechaServidor.Month,
                anioPeriodo = fechaServidor.Year,
                numeroCotizacion = 1,
                numeroCartaCompromiso = 1,
                eliminado = 0,
                activo = 1
            };

            return this.registrarNuevoPeriodo(newPeriodo);
        }
    }
}
